export default class Model {

    _id = ""

    $config = {
        /**唯一标识字段，例如值为'Id' */
        id: null
    }


    constructor(options) {
        options = options || {};
        /**构造函数中可指定唯一标识字段名称 */
        if (options.id) this.$config.id = options.id;
        /**定义_id */
        this._id = options._id || this.genrateId();
    }

    /**生成临时Id */
    genrateId() {
        var p1 = Math.random() * 100000000;
        var p2 = Math.random() * 100000000;
        var p3 = Math.random() * 100000000;
        var p4 = Math.random() * 100000000;
        return `${Math.round(p1)}-${Math.round(p2)}-${Math.round(p3)}-${Math.round(p4)}`;
    }

    /**判断参数是不是函数 */
    isFunction(obj) {
        return Object.prototype.toString.call(obj) === '[object Function]';
    }

    /**判断参数是不是对象 */
    isObject(obj) {
        return Object.prototype.toString.call(obj) === '[object Object]';
    }

    /**判断参数是不是对象 */
    isArray(obj) {
        return Object.prototype.toString.call(obj) === '[object Array]';
    }

    /**把参数的字段数据赋值给当前类，要求字段名称一致 */
    assign(model) {
        if (!this.isObject(model)) return;

        let myPublicField = [];

        for (var key in this) {
            /**以下划线开头的定义为私有变量 */
            if (key.indexOf('_') === 0) continue;
            /**$config不可以覆盖 */
            if (key === '$config') continue;
            /**方法过滤 */
            if (this.isFunction(this[key]) === '[object Function]') continue;
            myPublicField.push(key);
        }

        /**外来传值赋值给当前类的实例 */
        for (var key in model) {
            if (myPublicField.indexOf(key) === -1) continue;
            this[key] = model[key]
        }
        return this;
    }

    /**把自身转换成POJO */
    asObject(obj) {
        obj = obj || this;
        var pojo = {};
        var key;
        for (key in obj) {
            /**以下划线开头的字段名称为私有变量 */
            if (key.indexOf('_') === 0) continue;
            /**以$开头的字段名称为私有变量 */
            if (key.indexOf('$') === 0) continue;
            /**以$开头的字段名称为接口配置 */
            if (key === '$config') continue;
            /**函数 */
            if (this.isFunction(obj[key])) continue;
            /**数组 */
            if (this.isArray(obj[key])) {
                var vm = this;
                var array = obj[key];
                var result = [];
                array.forEach(item => {
                    var child = vm.convertPOJO(item);
                    result.push(child);
                })
                obj[key] = result;
            }

            if (this.isObject(obj[key])) {
                pojo[key] = this.convertPOJO(obj[key])
            } else {
                pojo[key] = obj[key]
            }
        }

        return pojo;
    }
}